﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AdmLaboratorios.DTO;
using AdmLaboratorios.Business;
using System.Xml;
using AdmLaboratorios.Business.Entities;

namespace AdmLaboratorios
{
    public partial class frmLogin : Form
    {
        const string ConfigLocal = "DB.config";
        const string CadenaLocalDefault = @"Data Source=LOCALHOST\SQLEXPRESS;Initial Catalog=AdmLaboratorios;Integrated Security=True";
        //const string CadenaLocalDefault = @"Data Source=accws02;Initial Catalog=liquidaciones_desa;Integrated Security=True";
        //const string CadenaLocalDefault = @"Data Source=VOSTRO\SQLEXPRESS,777;Initial Catalog=educativa;User ID=sa;Password=q1w2e3r4;";

        public frmLogin()
        {
            InitializeComponent();
        }

        private void OK_Click(object sender, EventArgs e)
        {
            UsuarioDTO usuario;

            errP.Clear();
            if (Seguridad.Login(txUsuario.Text.Trim(), txPassword.Text.Trim(), out usuario))
            {
                //Dejo el usuario lsito en el helper.
                BusinessHelper.Usuario = new Usuario(usuario);

                frmMDI f = new frmMDI();

                f.SetUser(usuario);

                //Iniciar Sesion.
                f.Show();
                f.BringToFront();
                this.Hide();
            }
            else
            {
                //Mostrar mensaje de error.
                errP.SetError(txUsuario, "Usuario o Contraseña incorrecta.");
            }
        }

        private void Cancel_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void frmLogin_Load(object sender, EventArgs e)
        {
            //Titulo del form con la Version.
            this.Text = string.Format("Inicio de Sesión - Adm. Laboratorios v{0}.{1}.{2}"
                , System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Major
                , System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Minor
                , System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Build);
        
            lblVersion.Text = string.Format("v{0}.{1}.{2}"
                , System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Major
                , System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Minor
                , System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Build);

            //Obtengo todos los Connection String que haya en el Config.
            if (!Conexion.TestConnection(ObtenerCadenasDeConexion(ConfigLocal)))
            {
                MessageBox.Show(
                    "Fue imposible realizar la conexión a la base de datos.\n" +
                    "Por favor, póngase en contacto con soporte:\n\n" +
                    "dariohf@gmail.com\n\n" +
                    "Disculpe las molestias."
                    , "Imposible conectar con la base de datos"
                    , MessageBoxButtons.OK
                    , MessageBoxIcon.Error);

                //No pudo conectar, asique cierro.
                Application.Exit();
            }
            //else
            //{
            //    cmbInstitucion.DisplayMember = "Nombre";
            //    cmbInstitucion.DataSource = Instituciones.Todas();
            //}
        }

        private void picLogo_Click(object sender, EventArgs e)
        {
            StartDefaultClient("dariohf@gmail.com");
        }

        private void StartDefaultClient(string direccion)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;

                string filename = string.Format("mailto:{0}", direccion);
                System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
                myProcess.StartInfo.FileName = filename;
                myProcess.StartInfo.UseShellExecute = true;
                myProcess.StartInfo.RedirectStandardOutput = false;
                myProcess.Start();
            }
            catch (Exception ex)
            {
                this.Cursor = Cursors.Default;
                MessageBox.Show(
                    "E-mail: " + direccion + @"\n
                    -------------------------------------\n\n
                    Ocurrió un error, al intentar acceder a su programa de correo electrónico.\n\n" + ex.Message
                    , "No se puede enviar el EMail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        private List<string> ObtenerCadenasDeConexion(string nombreConfig)
        {
            List<string> cadenas = new List<string>();
            XmlDocument xDoc = new XmlDocument();

            try
            {
                //La ruta del documento XML permite rutas relativas 
                //respecto del ejecutable!
                xDoc.Load(nombreConfig);

                XmlNodeList parametros = xDoc.GetElementsByTagName("Parametros");
                XmlNodeList lista = ((XmlElement)parametros[0]).GetElementsByTagName("CadenaDeConexion");

                if (lista.Count == 0)
                    throw new Exception("CadenaDeConexion Faltante");

                foreach (XmlElement nodo in lista)
                {
                    if (nodo.InnerText.Trim() != string.Empty)
                    {
                        cadenas.Add(nodo.InnerText);
                    }
                    else
                    {
                        //Uso el connection string default.
                        cadenas = new List<string>();
                        cadenas.Add(CadenaLocalDefault);
                    }
                }
                return cadenas;
            }
            catch (Exception)
            {
                //Uso el connection string default.
                cadenas = new List<string>();
                cadenas.Add(CadenaLocalDefault);
                return cadenas;
            }
        }
    }
}
